package com.zwh.se.constant_variable_operator;

/**
 * 转义字符:
 * 转义字符是一种特殊的字符,通过\加以使用,有着将后面普通的字母转换为特殊含义的功能。比如说换行符、制表符等。
 * 其实是因为有这些功能的字符不能显式地显示出来(比如换行),因此通过了这么一个规则来定义这样子就能代表这些字符的意思。
 *
 * @author yexi
 */
public class EscapeCharacter {
    public static void main(String[] args) {

        // \n: 换行符
        System.out.println("1111\n1111");
        // \\u000a
        printUnicode("\\n换行符",'\n');

        // \t: 水平制表符(tab)。可以在字符串中用来产生水平制表符的效果，用于输出对齐等。
        System.out.println("1111\t1111\t2222222222");
        // \\u0009
        printUnicode("\\t水平制表符",'\t');

        // \b: 退格符(backspace)。光标向左移动一个字符位置，用于删除字符。
        System.out.println("1111\b2222");
        // \\u0008
        printUnicode("\\b退格符",'\b');

        // \r: 回车符。让输出位置移到当前行的行首，也就是从当前行的最左边开始输出。
        System.out.println("aaa\rbbb");
        // \\u000d
        printUnicode("\\r回车符",'\r');

        // \\: 反斜线字符"\"
        System.out.println("1111\\2222");
        // \\u005c
        printUnicode("\\\\反斜线字符",'\\');

        // \": 双引号字符
        System.out.println("1111\"2222");
        // \\u0022
        printUnicode("\"双引号字符",'\"');

        // \\u: 后面跟一个十六进制的数,u代表的是Unicode的意思,也就是找到unicode编码表中对应的字符
        System.out.println('\uFFFF');

        //一些比较特别的unicode编码记录
        // 不间断空格,主要用在office中,让一个单词在结尾处不会换行显示。同时也是html中的&nbsp
        System.out.println('\u00A0');
        // 半角空格(英文符号),代码中常用的
        System.out.println('\u0020');
        // 全角空格(中文符号),中文文章中偶尔可见;
        System.out.println('\u3000');
    }

    /**
     * 输出字符的unicode编码
     *
     * @param msg 想附加的消息
     * @param c   要输出unicode编码的字符
     */
    static void printUnicode(String msg, char c) {
        //两种都可以
        System.out.printf(msg + "对应的Unicode码: \\u%04x%n", (int) c);
//        System.out.println(msg + "对应的Unicode码: " + String.format("\\u%04x", (int) '\t'));
    }
}
